package com.wondersgroup.restbase.service;

import java.io.Serializable;
import java.util.List;

/**
 * 公共基础业务抽象基类
 * @author wondersgroup
 *
 * @param <T> 业务实体类型参数
 */
public interface BaseService<T> {
	/**
	 * 保存业务数据
	 * @param t 实体对象
	 * @return 已保存的实体对象
	 */
	public T save(T t);
	/**
	 * 删除业务数据
	 * @param id 业务主键
	 */
	public void delete(Serializable id);
	/**
	 * 加载业务数据
	 * @param id 业务主键
	 * @return
	 */
	public T load(Serializable id);
	/**
	 * 分页加载业务数据
	 * @param start 起始记录索引
	 * @param count 返回记录个数
	 * @return 业务实体集合
	 */
	public List<T> load(Integer start, Integer count);
	/**
	 * 加载所有业务数据
	 * @return 业务实体集合
	 */
	public List<T> loadAll();
	/**
	 * 按属性加载业务数据
	 * @param propName 属性名
	 * @param propValue 属性值
	 * @param startNoAndSize 分页条件
	 * @return 业务实体集合
	 */
	public List<T> load(String propName, Object propValue, final int... startNoAndSize);
	/**
	 * 根据唯一属性加载唯一的业务数据
	 * @param propName 属性名
	 * @param propValue 属性值
	 * @return 业务实体
	 */
	public T loadFirstByUniqueProperty(String propName, Object propValue);
	/**
	 * 根据sql语句加载唯一的业务数据
	 * @param sql 查询语句
	 * @param values 预编译参数
	 * @return 业务实体
	 */
	public T loadFirstByQuery(String sql, Object... values);
	/**
	 * 获得sql语句对应的结果记录数
	 * @param sql 查询语句
	 * @param values 预编译参数
	 * @return 结果记录数
	 */
	public long getCount(String sql, Object... values);
	/**
	 * 测试数据库是否可用
	 */
	public void testDao();
	/**
	 * 根据业务实体类型获取对应的服务对象
	 * @param clazz 业务实体类型对象
	 * @return 服务对象
	 */
	public <M> BaseService<M> newService(Class<M> clazz);
}
